package com.syg.rabbitmq.producer;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * <img width="宽度" height="高度" src="../../../../../resources/picture/RabbitMQ概览.png" alt="RabbitMQ概览">
 *     <br/>
 *
 * <img width="宽度" height="高度" src="../../../../../resources/picture/simple模式.png" alt="简单模式默认交换机">
 *     <br/>
 * 1,简单队列模式（simple模式）：<br/>
 *    不用显示声明交换机,只需要声明一个队列。生产者指定队列名发送消息给MQ，然后会有一个默认的交换机将消息发送给这个队列。
 *    消费者负责监听这个队列，一有消息就会得到通知做出相应。
 */
public class Simple_Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1,创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        //2,设置参数  设定连接信息，基操
        factory.setHost("127.0.0.1");
        factory.setPort(5672);  //注意这里写5672，是amqp协议端口
        factory.setUsername("guest");
        factory.setPassword("guest");
        // 为什么这里声明虚拟主机会报错呢？
        factory.setVirtualHost("/");

        // 3,创建连接
        Connection connection = factory.newConnection();
        // 4,创建Channel
        Channel channel = connection.createChannel();

        // 5,创建队列，如果此队列不存在，会自动创建
        /*
                queue:队列名称
                durable:是否持久化,当mq重启之后还在。
                exclusive：是否独占。只能有一个消费者监听这个队列。当connection关闭时,是否删除
                autoDelete：是否自动删除，当没有消费者监听时,删除
         */
        // 如果没有yyds的队列,则会创建一个队列，如果存在则不创建。
        channel.queueDeclare("yyds", false, false, false, null);

        // 6,发送消息
        /*
            exchange：交换机名称，简单模式默认的交换机是""
            routingKey:路由名称。简单模式，路由名称与队列名称一致
            props:配置信息
            body:发送消息
         */
        channel.basicPublish("", "yyds", null, "Hello World!".getBytes());

        // 7，关闭资源。如果不关闭会一直开着
        channel.close();
        connection.close();
    }
}
